/**
 * 执行上下文栈
 */

var a = 10, fn, bar = function (x) {
    var b = 5;
    fn(x + b);
};


fn = function (y) {
    var c = 5;
    console.log(y + c);
};

bar(10);


/**
 * window 执行环境
 * 自准备：定义变量默认=undefined , 再执行过程中，从上到下，做赋值。细节如下。
 *
 * 1、构建全局上下文 定义全局变量undefined , 执行赋值。给 a 赋值，bar赋值 ， fn赋值。
 *
 * 2、执行到bar的时候
 *      构建bar函数上下文 ， 定义变量undefined , 执行赋值。给 b 赋值
 *
 * 3、执行到fn(x+b)的候
 *      构建fn上下文 ， 定义变量undefined , 执行赋值， 给c　赋值。
 *
 *
 * 上述执行过程中有1个全局上下文2个函数上下文。
 *
 * 其实是压栈的过程，执行完后，出栈销毁。最后只剩下全局上下文。（注：這是一种比较理想的情况，顺利销毁。遇到闭包就不能這样顺利的销毁了。下回分解。。。）
 *
 * fn上下文
 *   bar上下文
 *      全局上下文
 *
 */